package com.sheng.leetcode.year2022.month09.day15;

import org.junit.Test;

/**
 * @author liusheng
 * @date 2022/09/15
 *<p>
 * 672. 灯泡开关 Ⅱ<p>
 *<p>
 * 房间中有 n只已经打开的灯泡，编号从 1 到 n 。墙上挂着 4 个开关 。<p>
 * 这 4 个开关各自都具有不同的功能，其中：<p>
 * 开关 1 ：反转当前所有灯的状态（即开变为关，关变为开）<p>
 * 开关 2 ：反转编号为偶数的灯的状态（即 2, 4, ...）<p>
 * 开关 3 ：反转编号为奇数的灯的状态（即 1, 3, ...）<p>
 * 开关 4 ：反转编号为 j = 3k + 1 的灯的状态，其中 k = 0, 1, 2, ...（即 1, 4, 7, 10, ...）<p>
 * 你必须 恰好 按压开关 presses 次。每次按压，你都需要从 4 个开关中选出一个来执行按压操作。<p>
 * 给你两个整数 n 和 presses ，执行完所有按压之后，返回 不同可能状态 的数量。<p>
 *<p>
 * 示例 1：<p>
 * 输入：n = 1, presses = 1<p>
 * 输出：2<p>
 * 解释：状态可以是：<p>
 * - 按压开关 1 ，[关]<p>
 * - 按压开关 2 ，[开]<p>
 *<p>
 * 示例 2：<p>
 * 输入：n = 2, presses = 1<p>
 * 输出：3<p>
 * 解释：状态可以是：<p>
 * - 按压开关 1 ，[关, 关]<p>
 * - 按压开关 2 ，[开, 关]<p>
 * - 按压开关 3 ，[关, 开]<p>
 *<p>
 * 示例 3：<p>
 * 输入：n = 3, presses = 1<p>
 * 输出：4<p>
 * 解释：状态可以是：<p>
 * - 按压开关 1 ，[关, 关, 关]<p>
 * - 按压开关 2 ，[关, 开, 关]<p>
 * - 按压开关 3 ，[开, 关, 开]<p>
 * - 按压开关 4 ，[关, 开, 开]<p>
 *<p>
 * 提示：<p>
 *<p>
 * 1 <= n <= 1000<p>
 * 0 <= presses <= 1000<p>
 *<p>
 * 来源：力扣（LeetCode）<p>
 * 链接：<a href="https://leetcode.cn/problems/bulb-switcher-ii">...</a><p>
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。<p>
 */
public class LeetCode0672 {

    @Test
    public void test01() {
        int n = 1, presses = 1;
//        int n = 2, presses = 1;
//        int n = 3, presses = 1;
        System.out.println(new Solution().flipLights(n, presses));
    }
}
class Solution {
    public int flipLights(int n, int presses) {
        /**      |                       |                       |
         *       1   2   3   4   5   6   7   8   9   10  11  12  13  14  15  16  17  18
         * 开关1  √   √   √   √   √   √   √   √   √   √   √   √   √   √   √   √   √   √
         * 开关2      √       √       √       √       √       √       √       √       √
         * 开关3  √       √       √       √       √       √       √       √       √
         * 开关4  √           √           √           √           √           √
         *
         * 假设开关1做了a次，开关2做了b次，开关3做了c次，开关4做了d次
         * 那么灯泡是否会亮有以下结论（0为暗，1为亮）
         * 灯泡1 = (a + c + d + 1) % 2
         * 灯泡2 = (a + b + 1) % 2
         * 灯泡3 = (a + c + 1) % 2
         * 灯泡4 = (a + b + d + 1) % 2
         * 灯泡5 = (a + c + 1) % 2
         * 灯泡6 = (a + b + 1) % 2
         * presses > 4 时，一定会有一个按钮被重复次数的按，按下次数为偶数时，相当于没做，大于4的次数都可以化简
         */
        if (n == 0 || presses == 0) {
            return 1;
        }
        int[] ints;
        if (presses == 1) {
            ints = new int[]{2,3,4,4};
        } else if (presses == 2) {
            ints = new int[]{2,4,7,7};
        } else {
            ints = new int[]{2,4,8,8};
        }
        if (n < 4) {
            return ints[n - 1];
        }
        return ints[3];
    }
}
